/**
 * 基于云开发的登录注册API服务
 */

import { StorageKeys } from './types'
import { setUserAvatarUrl } from '../../../utils/user-avatar.js'

/**
 * 密码登录
 * @param {Object} data 登录数据
 * @returns {Promise} 登录结果
 */
export async function passwordLogin(data) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'login',
      data: {
        action: 'passwordLogin',
        data: data
      }
    })
    
    if (result.result.success) {
      // 从 data 字段中提取实际数据
      const responseData = result.result.data || result.result;
      
      // 保存token和用户信息
      if (responseData.token) {
        await saveLoginInfo(responseData)
        // 保存登录方式
        wx.setStorageSync(StorageKeys.LOGIN_TYPE, 'password')
      } else {
        console.error('密码登录成功但返回数据为空:', result.result)
      }
      result.result.success = true
    }
    
    return result.result
  } catch (error) {
    console.error('密码登录失败:', error)
    return {
      success: false,
      code: 500,
      message: '登录失败，请重试'
    }
  }
}

/**
 * 验证码登录
 * @param {Object} data 登录数据
 * @returns {Promise} 登录结果
 */
export async function codeLogin(data) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'login',
      data: {
        action: 'quickLogin',
        data: data
      }
    })
    
    if (result.result.success) {
      // 从 data 字段中提取实际数据
      const responseData = result.result.data || result.result;
      
      // 保存token和用户信息
      if (responseData.token) {
        await saveLoginInfo(responseData)
        // 保存登录方式
        wx.setStorageSync(StorageKeys.LOGIN_TYPE, 'code')
      } else {
        console.error('验证码登录成功但返回数据为空:', result.result)
      }
      
      // 返回展平的数据结构，方便前端访问
      return {
        success: true,
        ...responseData
      }
    }
    
    return result.result
  } catch (error) {
    console.error('验证码登录失败:', error)
    return {
      success: false,
      code: 500,
      message: '登录失败，请重试'
    }
  }
}

/**
 * 用户注册
 * @param {Object} data 注册数据
 * @returns {Promise} 注册结果
 */
export async function register(data) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'login',
      data: {
        action: 'register',
        data: data
      }
    })
    
    if (result.result.success) {
      // 从 data 字段中提取实际数据
      const responseData = result.result.data || result.result;
      
      // 注册成功后自动保存登录信息
      if (responseData.token) {
        await saveLoginInfo(responseData)
        wx.setStorageSync(StorageKeys.LOGIN_TYPE, 'register')
      } else {
        console.error('注册成功但返回数据为空:', result.result)
      }
      result.result.success = true
    }
    
    return result.result
  } catch (error) {
    console.error('注册失败:', error)
    return {
      success: false,
      code: 500,
      message: '注册失败，请重试'
    }
  }
}

/**
 * 发送验证码
 * @param {Object} data 发送验证码数据
 * @returns {Promise} 发送结果
 */
export async function sendVerifyCode(data) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'sms',
      data: {
        action: 'sendCode',
        data: data
      }
    })
    
    // 添加success字段以保持一致性
    if (result.result.code === 200) {
      result.result.success = true
    }
    
    return result.result
  } catch (error) {
    console.error('发送验证码失败:', error)
    return {
      success: false,
      code: 500,
      message: '发送验证码失败，请重试'
    }
  }
}

/**
 * 验证验证码
 * @param {string} phone 手机号
 * @param {string} code 验证码
 * @returns {Promise} 验证结果
 */
export async function verifyCode(phone, code) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'sms',
      data: {
        action: 'verifyCode',
        data: { phone, code }
      }
    })
    
    return result.result
  } catch (error) {
    console.error('验证码验证失败:', error)
    return {
      success: false,
      code: 500,
      message: '验证码验证失败'
    }
  }
}

/**
 * 检查用户名是否可用
 * @param {string} username 用户名
 * @returns {Promise} 检查结果
 */
export async function checkUsername(username) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'login',
      data: {
        action: 'checkUsername',
        data: { username }
      }
    })
    
    return result.result
  } catch (error) {
    console.error('检查用户名失败:', error)
    return {
      success: false,
      code: 500,
      message: '检查用户名失败',
      data: { available: false }
    }
  }
}

/**
 * 检查手机号是否已注册
 * @param {string} phone 手机号
 * @returns {Promise} 检查结果
 */
export async function checkPhone(phone) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'login',
      data: {
        action: 'checkPhone',
        data: { phone }
      }
    })
    
    return result.result
  } catch (error) {
    console.error('检查手机号失败:', error)
    return {
      success: false,
      code: 500,
      message: '检查手机号失败',
      data: { exists: true } // 出错时默认认为已存在，避免重复注册
    }
  }
}

/**
 * 获取用户信息
 * @returns {Promise} 用户信息
 */
export async function getUserInfo() {
  try {
    // 从云数据库获取用户信息
    const result = await wx.cloud.callFunction({
      name: 'user',
      data: {
        action: 'getUserInfo'
      }
    })
    
    if (result.result.success) {
      // 更新本地存储的用户信息
      wx.setStorageSync(StorageKeys.USER_INFO, result.result.data)
    }
    
    return result.result
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return {
      success: false,
      code: 500,
      message: '获取用户信息失败'
    }
  }
}

/**
 * 退出登录
 * @returns {Promise} 退出结果
 */
export async function logout() {
  try {
    // 调用云函数清除服务端token
    const result = await wx.cloud.callFunction({
      name: 'user',
      data: {
        action: 'logout'
      }
    })
    
    // 清除本地存储
    clearLoginInfo()
    
    return {
      success: true,
      code: 200,
      message: '已退出登录'
    }
  } catch (error) {
    console.error('退出登录失败:', error)
    // 即使接口失败也清除本地存储
    clearLoginInfo()
    return {
      success: true,
      code: 200,
      message: '已退出登录'
    }
  }
}

/**
 * 保存登录信息到本地存储
 * @param {Object} data 登录响应数据
 */
async function saveLoginInfo(data) {
  try {
    // 参数验证
    if (!data) {
      console.error('保存登录信息失败: data 参数为空')
      return
    }
    
    if (!data.token) {
      console.error('保存登录信息失败: token 字段不存在', data)
      return
    }
    
    // 保存token
    wx.setStorageSync(StorageKeys.ACCESS_TOKEN, data.token)
    
    // 保存用户信息并设置头像
    if (data.userInfo) {
      // 为登录用户设置固定头像
      const userInfoWithAvatar = await setUserAvatarUrl(data.userInfo)
      wx.setStorageSync(StorageKeys.USER_INFO, userInfoWithAvatar)
    }
    
    console.log('登录信息已保存')
  } catch (error) {
    console.error('保存登录信息失败:', error)
  }
}

/**
 * 清除登录信息
 */
function clearLoginInfo() {
  try {
    wx.removeStorageSync(StorageKeys.ACCESS_TOKEN)
    wx.removeStorageSync(StorageKeys.USER_INFO)
    wx.removeStorageSync(StorageKeys.LOGIN_TYPE)
    console.log('登录信息已清除')
  } catch (error) {
    console.error('清除登录信息失败:', error)
  }
}

/**
 * 检查登录状态
 * @returns {boolean} 是否已登录
 */
export function isLoggedIn() {
  try {
    const token = wx.getStorageSync(StorageKeys.ACCESS_TOKEN)
    return !!token
  } catch (error) {
    console.error('检查登录状态失败:', error)
    return false
  }
}

/**
 * 获取本地存储的用户信息
 * @returns {Object|null} 用户信息
 */
export function getLocalUserInfo() {
  try {
    const userInfo = wx.getStorageSync(StorageKeys.USER_INFO)
    return userInfo || null
  } catch (error) {
    console.error('获取本地用户信息失败:', error)
    return null
  }
}

/**
 * 获取本地存储的token
 * @returns {string|null} token
 */
export function getLocalToken() {
  try {
    const token = wx.getStorageSync(StorageKeys.ACCESS_TOKEN)
    return token || null
  } catch (error) {
    console.error('获取本地token失败:', error)
    return null
  }
}

/**
 * 处理登录成功后的跳转
 * @param {string} redirectUrl 重定向URL（可选）
 */
export function handleLoginSuccess(redirectUrl) {
  if (redirectUrl) {
    // 如果有重定向URL，则跳转到指定页面
    wx.navigateTo({
      url: redirectUrl,
      fail: () => {
        // 如果跳转失败，则回到首页
        wx.switchTab({ url: '/pages/home/index' })
      }
    })
  } else {
    // 默认跳转到个人中心
    wx.switchTab({
      url: '/pages/my/index',
      fail: () => {
        // 如果跳转失败，则回到首页
        wx.switchTab({ url: '/pages/home/index' })
      }
    })
  }
}

/**
 * 显示API错误消息
 * @param {Object} response API响应
 */
export function showApiError(response) {
  const message = response.message || '操作失败，请重试'
  wx.showToast({
    title: message,
    icon: 'none',
    duration: 2000
  })
}

/**
 * 显示成功消息
 * @param {string} message 消息内容
 */
export function showSuccess(message) {
  wx.showToast({
    title: message,
    icon: 'success',
    duration: 2000
  })
} 